---
title: SAIF.Business.Tasks operations and processes
summary: Business and technical operations supported by this library.
status: draft
owner: SAIF Documentation
last_reviewed: 2026-08-21
library: SAIF.Business.Tasks
reference_type: embedded
---

# SAIF.Business.Tasks operations and processes

This page is the operation catalog and cross-operation hub for this library. Each operation's detailed, step-by-step logic lives in its own page under `operations/`.

## Operation catalog
| Operation | Intent | Trigger | Inputs | Outputs | Rules | Tables | SQL |
| --- | --- | --- | --- | --- | --- | --- | --- |
| [Retrieve a filtered task list](operations/retrieve-filtered-task-list.md) | Return tasks matching caller-supplied search criteria | Application-layer request for a task list | `IDataPortalInfo`, populated `Criteria` | Populated `clsTaskCollection` | [BR-016](business-rules.md#br-016-mailids-are-stored-and-compared-trimmed-and-upper-cased), [BR-017](business-rules.md#br-017-completed-tasks-are-excluded-from-searches-unless-showcompleted-is-set), [BR-018](business-rules.md#br-018-a-priority-level-filter-selects-that-priority-and-all-higher-ones), [BR-019](business-rules.md#br-019-filter-values-accept-single-values-or-lists), [BR-020](business-rules.md#br-020-date-range-filtering-compares-the-truncated-task-date), [BR-021](business-rules.md#br-021-result-sets-may-be-capped-to-n-most-relevant-rows), [BR-022](business-rules.md#br-022-retrieval-of-a-task-with-no-concrete-task-class-is-not-permitted) | [TASK](database-tables.md#task) | [SQL-008](sql/SQL-008-retrieve-filtered-task-list.md) |
| [Create/insert a task](operations/create-insert-task.md) | Persist a new task row | Application creates a concrete task and calls `Save()` | New `clsTask` instance | Inserted `TASK` row, `TaskSeqNum` assigned | [BR-001](business-rules.md#br-001-a-task-must-have-a-task-category-code), [BR-010](business-rules.md#br-010-task-insert-must-affect-exactly-one-row), [BR-014](business-rules.md#br-014-creating-user-defaults-to-the-data-portal-user-identity), [BR-015](business-rules.md#br-015-new-tasks-start-not-completed-and-without-a-notepad-entry), [BR-016](business-rules.md#br-016-mailids-are-stored-and-compared-trimmed-and-upper-cased) | [TASK](database-tables.md#task) | [SQL-001](sql/SQL-001-insert-task.md), [SQL-005](sql/SQL-005-valid-source-category-check.md) |
| [Update a task](operations/update-task.md) | Persist changes to an existing task | Application calls `Save()` on a modified task | Modified `clsTask` instance | Updated `TASK` row | [BR-011](business-rules.md#br-011-task-update-must-affect-exactly-one-row), [BR-013](business-rules.md#br-013-optimistic-concurrency-via-update-sequence-number), [BR-016](business-rules.md#br-016-mailids-are-stored-and-compared-trimmed-and-upper-cased) | [TASK](database-tables.md#task) | [SQL-013](sql/SQL-013-update-task.md) |
| [Delete (complete) a task](operations/delete-complete-task.md) | Mark a task completed/deleted | Application calls delete on a task | Existing `clsTask` instance | Updated `TASK` row (soft-delete)* | [BR-012](business-rules.md#br-012-task-delete-must-affect-exactly-one-row), [BR-013](business-rules.md#br-013-optimistic-concurrency-via-update-sequence-number) | [TASK](database-tables.md#task) | [SQL-014](sql/SQL-014-delete-task.md) |
| [Assign and normalize a task due date](operations/assign-normalize-task-due-date.md) | Normalize a due date to a working day | Any assignment to `TaskDate` | Candidate date, `TaskDateModifier` | Normalized `TaskDate`, `TaskDateModified` flag | [BR-008](business-rules.md#br-008-automatic-due-date-shifting-must-be-surfaced-as-a-warning), [BR-009](business-rules.md#br-009-a-non-working-day-due-date-is-moved-to-a-working-day) | N/A | N/A |
| [Retrieve a single task](operations/retrieve-single-task.md) | Load one task by sequence number | Application requests a specific task | `TaskSeqNum` | Populated `clsTask` instance | N/A | [TASK](database-tables.md#task) | [SQL-002](sql/SQL-002-select-task.md) |
| [Purge completed tasks](operations/purge-completed-tasks.md) | Remove old completed tasks past retention | Batch/maintenance caller | Source code, category code, retention days | Count of purged rows | N/A | [TASK](database-tables.md#task) | [SQL-015](sql/SQL-015-purge-tasks.md) |
| [Save a task collection](operations/save-task-collection.md) | Persist pending edits across a task collection | Application calls `Save()` on a collection | `clsTaskCollection` with pending edits | Persisted inserts/updates/deletes | N/A | [TASK](database-tables.md#task) | [SQL-001](sql/SQL-001-insert-task.md), [SQL-013](sql/SQL-013-update-task.md), [SQL-014](sql/SQL-014-delete-task.md) |
| [Load a code table](operations/load-code-table.md) | Retrieve read-only code-table rows for translation/display | Application requests action/category/priority/source codes | Optional `Code` and/or `TaskSourceCode` filter | Populated code object or collection | [BR-023](business-rules.md#br-023-code-tables-are-read-only-reference-data), [BR-024](business-rules.md#br-024-a-category-code-collection-is-valid-only-if-at-least-one-row-was-found), [BR-025](business-rules.md#br-025-unrecognized-codes-map-to-a-safe-default) | [TASK_ACTION_CODE](database-tables.md#task_action_code), [TASK_CATEGORY_CODE](database-tables.md#task_category_code), [TASK_PRIORITY_CODE](database-tables.md#task_priority_code), [TASK_SOURCE_CODE](database-tables.md#task_source_code) | [SQL-003](sql/SQL-003-select-task-action-code.md), [SQL-004](sql/SQL-004-select-task-action-code-list.md), [SQL-006](sql/SQL-006-select-task-category-code.md), [SQL-007](sql/SQL-007-select-task-category-code-list.md), [SQL-009](sql/SQL-009-select-task-priority-code.md), [SQL-010](sql/SQL-010-select-task-priority-code-list.md), [SQL-011](sql/SQL-011-select-task-source-code.md), [SQL-012](sql/SQL-012-select-task-source-code-list.md) |
| [Copy a task to another user](operations/copy-task-to-another-user.md) | Duplicate a task's core fields onto a new instance | Descendant `CopyTo(inMailID)` | Source `clsTask` | New `iTask` with copied fields and duplicated context | N/A | N/A | N/A |
| [Snapshot/restore task state](operations/snapshot-restore-task-state.md) | Capture and later restore a task's in-memory state | Framework edit/cancel lifecycle | `clsTask` instance | `TaskStore` snapshot / restored fields | N/A | N/A | N/A |

## Process flow diagram
The following diagram visualizes the primary operational flow across operations.

```mermaid
flowchart TD
	Start([Application request]) --> Decision{Operation type?}
	Decision -->|Search| Retrieve[Retrieve filtered task list]
	Decision -->|Save new| Create[Create/insert a task]
	Decision -->|Save existing| Update[Update a task]
	Decision -->|Complete| Delete[Delete/complete a task]
	Create --> Rules{Rules pass?}
	Rules -->|No| ErrEnd([Save blocked])
	Rules -->|Yes| Insert[SQL-001 task_insert]
	Update --> Rules
	Rules -->|Yes, update path| UpdateSQL[SQL-013 task_update]
	Delete --> DeleteSQL[SQL-014 task_delete]
	Retrieve --> RetrieveSQL[SQL-008 dynamic SELECT]
```

## Database interactions

The following table summarizes which operations read from or write to the database. Per-step SQL and table citations live in each operation's detail page under `operations/`.

| Operation | SQL | Tables | Type |
| --- | --- | --- | --- |
| [Retrieve a filtered task list](operations/retrieve-filtered-task-list.md) | [SQL-008](sql/SQL-008-retrieve-filtered-task-list.md) | [TASK](database-tables.md#task) | Read |
| [Create/insert a task](operations/create-insert-task.md) | [SQL-001](sql/SQL-001-insert-task.md), [SQL-005](sql/SQL-005-valid-source-category-check.md) | [TASK](database-tables.md#task), [TASK_CATEGORY_CODE](database-tables.md#task_category_code) | Write / Read |
| [Update a task](operations/update-task.md) | [SQL-013](sql/SQL-013-update-task.md) | [TASK](database-tables.md#task) | Write |
| [Delete (complete) a task](operations/delete-complete-task.md) | [SQL-014](sql/SQL-014-delete-task.md) | [TASK](database-tables.md#task) | Write |
| [Retrieve a single task](operations/retrieve-single-task.md) | [SQL-002](sql/SQL-002-select-task.md) | [TASK](database-tables.md#task) | Read |
| [Purge completed tasks](operations/purge-completed-tasks.md) | [SQL-015](sql/SQL-015-purge-tasks.md) | [TASK](database-tables.md#task) | Write |
| [Load a code table](operations/load-code-table.md) | [SQL-003](sql/SQL-003-select-task-action-code.md), [SQL-004](sql/SQL-004-select-task-action-code-list.md), [SQL-006](sql/SQL-006-select-task-category-code.md), [SQL-007](sql/SQL-007-select-task-category-code-list.md), [SQL-009](sql/SQL-009-select-task-priority-code.md), [SQL-010](sql/SQL-010-select-task-priority-code-list.md), [SQL-011](sql/SQL-011-select-task-source-code.md), [SQL-012](sql/SQL-012-select-task-source-code-list.md) | [TASK_ACTION_CODE](database-tables.md#task_action_code), [TASK_CATEGORY_CODE](database-tables.md#task_category_code), [TASK_PRIORITY_CODE](database-tables.md#task_priority_code), [TASK_SOURCE_CODE](database-tables.md#task_source_code) | Read |

## Failure and edge-case behavior
- Retrieving a task whose source system has no registered concrete task class throws `ApplicationException("<source description> Tasks are not yet supported!")` ([BR-022](business-rules.md#br-022-retrieval-of-a-task-with-no-concrete-task-class-is-not-permitted)).
- Insert/update/delete each verify `RowsAffected = 1`; any other value raises an error message rather than an exception, leaving the object in an error state for the caller to inspect ([BR-010](business-rules.md#br-010-task-insert-must-affect-exactly-one-row), [BR-011](business-rules.md#br-011-task-update-must-affect-exactly-one-row), [BR-012](business-rules.md#br-012-task-delete-must-affect-exactly-one-row)).
- A stale `UpdateSeqNum` (optimistic concurrency conflict) causes zero rows affected on update/delete, surfacing as a contention error ([BR-013](business-rules.md#br-013-optimistic-concurrency-via-update-sequence-number)).
- `clsTaskCollection.Criteria.WhereClause` always returns an empty string because the internal `FormatWhereClause()` is never invoked by `FormatRequest` — likely dead/legacy code.*

## Stored procedure operations

Operations implemented in Oracle stored procedures referenced by this library.

| Operation | Description | Source | Link |
| --- | --- | --- | --- |
| Create task | Inserts a new row into `TASK` with a sequence-assigned key, server-side audit stamps, an active (`'N'`) delete flag, and zero-to-null normalisation of claim and policy references. Returns the affected row count. | `pk82036_task.task_insert` | [Details](procedures/pk82036-task.md#operations) |
| Retrieve task | Opens a REF CURSOR over a single `TASK` row selected by `task_seq_num`, projecting 25 columns under camel-cased aliases consumed by `clsTask.Fill`. | `pk82036_task.task_select` | [Details](procedures/pk82036-task.md#operations) |
| Update task | Updates the mutable attributes of an existing `TASK` row under an optimistic-concurrency check, advancing `update_seq_num` and re-stamping `update_date` / `update_user`. Source code and creator are not updatable. | `pk82036_task.task_update` | [Details](procedures/pk82036-task.md#operations) |
| Logically delete task | Marks a `TASK` row as deleted by setting `delete_flag = 'Y'` under an optimistic-concurrency check, preserving the row for history and later purge. | `pk82036_task.task_delete` | [Details](procedures/pk82036-task.md#operations) |
| Purge aged deleted tasks | Physically removes previously soft-deleted `TASK` rows for a given source and category whose last update is older than a caller-supplied retention window in days, and returns the deleted row count. | `PK82036_Task.Task_Purge` | [Details](procedures/pk82036-task.md#operations) |

## Related documentation
- [Index](index.md)
- [Overview](overview.md)
- [Architecture](architecture.md)
- [Dependencies](dependencies.md)
- [Business rules](business-rules.md)
- [Database tables](database-tables.md)
- [SQL catalog](sql/index.md)
- [Procedures](procedures/index.md)
- [API reference](api/index.md)

> **Note:** Statements marked with * were inferred from code structure, naming conventions, or
> contextual evidence where direct confirmation was not available in source artifacts. Statements
> marked with ** could not be confirmed; treat as unknown until verified.

## Sources
- SAIF.Business.Tasks/clsTask.vb
- SAIF.Business.Tasks/clsTaskCollection.vb
- SAIF.Business.Tasks/clsTaskActionCode.vb
- SAIF.Business.Tasks/clsTaskActionCodeCollection.vb
- SAIF.Business.Tasks/clsTaskCategoryCode.vb
- SAIF.Business.Tasks/clsTaskCategoryCodeCollection.vb
- SAIF.Business.Tasks/clsTaskPriorityCode.vb
- SAIF.Business.Tasks/clsTaskPriorityCodeCollection.vb
- SAIF.Business.Tasks/clsTaskSourceCode.vb
- SAIF.Business.Tasks/clsTaskSourceCodeCollection.vb
